function maxValue(grid) {
    let m = grid.length, n = grid[0].length;
    let dp = Array.from(Array(m)).map(()=> Array(n).fill(0));

    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            if (i === 0 && j === 0) {
                dp[i][j] = grid[i][j];
            } else if (i === 0) {
                dp[i][j] = dp[i][j-1] + grid[i][j];
            } else if (j === 0) {
                dp[i][j] = dp[i-1][j] + grid[i][j];
            } else {
                dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]) + grid[i][j];
            };
        };
    };
    return dp[m-1][n-1];
};


// test
const grid  = [
    [1,3,1],
    [1,5,1],
    [4,2,1]
];

const res = maxValue(grid);

console.log(res);   // 12
